﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using Ortodoctor.Componentes;
using System.Web;
using System.Web.Services;

namespace Ortodoctor.modelo
{
    class modeloParcelas
    {
        //string connectionstring = ("Server=186.202.152.24;Port=5432;User Id=ortodoctor1;Password=DycbqDfHLI;Database=ortodoctor1;MinPoolSize=5;CommandTimeout=60;");
        string connectionstring = ("Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=ortodoctor;MinPoolSize=5;CommandTimeout=60;"); NpgsqlCommand com;
        NpgsqlConnection conn;
        NpgsqlDataAdapter da;
        //conexao con = new conexao();
        public modeloParcelas()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public void insert(Parcelas p)
        {
            try
            {
                //con.open();
                String sql = "INSERT INTO parcelas(valor, data_vencimento, id_procedimento_cliente, " +
                             "status) VALUES (:p1, :p2, :p3, :p4)";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);

                com.Parameters.AddWithValue("p1", p.Valor);
                com.Parameters.AddWithValue("p2", p.DataVencimento.ToString("MM/dd/yyyy"));
                com.Parameters.AddWithValue("p3", p.ProcedimentoCliente);
                com.Parameters.AddWithValue("p4", p.Status);
                com.ExecuteNonQuery();
            }
            finally { conn.Close(); }
        }

        public void transferirParaNovoMes (int id_parcela)
        {
            try
            {
                //con.open();
                String sql = "UPDATE parcelas SET data_vencimento=select cast "+
                   " ((data_vencimento + 1*'1 month'::interval) as date) from parcelas  where id_parceoa = :id "+
                   "and data_vencimento=(select max(data_vencimento) from parcelas where id_parcela = :id)";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id_parcela);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public DataTable getAll()
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"SELECT * FROM PARCELAS INNER JOIN PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO_CLIENTE) 
                         INNER JOIN PROCEDIMENTO USING(ID_PROCEDIMENTO) INNER JOIN CLIENTE USING(ID_CLIENTE) ORDER BY id_parcela, NOME, DATA_VENCIMENTO";
                if (HttpContext.Current.Session["USUARIO_ACESSO"].ToString().CompareTo("2") != 0)
                {
                    sql = @"SELECT * FROM PARCELAS INNER JOIN PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO_CLIENTE) 
                         INNER JOIN PROCEDIMENTO USING(ID_PROCEDIMENTO) INNER JOIN CLIENTE USING(ID_CLIENTE) 
                         WHERE CLIENTE.ID_CLINICA=" + HttpContext.Current.Session["ID_CLINICA"] + " ORDER BY id_parcela, NOME, DATA_VENCIMENTO";
                }
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getOrcamento(int id_orcamento)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM parcelas INNER JOIN procedimento_cliente USING(id_procedimento_cliente) " +
                             "INNER JOIN procedimento USING(id_procedimento) WHERE id_orcamento=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id_orcamento", id_orcamento);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DataTable getOrcamentoPorCliente(int id_cliente)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM parcelas INNER JOIN procedimento_cliente USING(id_procedimento_cliente) " +
                             "INNER JOIN procedimento USING(id_procedimento) WHERE id_cliente=:id";

                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id_cliente", id_cliente);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public void update(Parcelas p)
        {
            try
            {
                //con.open();
                String sql = "UPDATE parcelas SET valor=:p1, status=:p2 " +
                    "WHERE id_procedimento_cliente=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", p.Valor);
                com.Parameters.AddWithValue("p2", p.Status);
                com.Parameters.AddWithValue("id", p.ProcedimentoCliente);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public void updateStatus(Parcelas p)
        {
            try
            {
                //con.open();
                String sql = "UPDATE parcelas SET status=:p1 " +
                    "WHERE id_parcela=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", p.Status);
                com.Parameters.AddWithValue("id", p.IdParcela);
                com.ExecuteNonQuery();
            }finally{
                conn.Close();
            }
        }

        public void delete(int id)
        {
            try
            {
                //con.open();
                String sql = "DELETE FROM parcelas WHERE id_parcela=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        internal DataTable getParcelas(int idCliente, int idProcedimento)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"SELECT * FROM PARCELAS INNER JOIN 
                                PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO_CLIENTE) INNER JOIN 
                                PROCEDIMENTO USING(ID_PROCEDIMENTO) INNER JOIN CLIENTE USING(ID_CLIENTE) 
                            WHERE (ID_CLIENTE = :idCliente OR 99999999 = :idCliente) AND 
                                  (ID_PROCEDIMENTO = :idProcedimento OR 99999999 = :idProcedimento) order by id_parcela";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("idCliente", idCliente);
                com.Parameters.AddWithValue("idProcedimento", idProcedimento);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        internal DataTable getParcelasProcedimento(int IDPROCEDIMENTO)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"SELECT * FROM PARCELAS INNER JOIN 
                                PROCEDIMENTO_CLIENTE USING(ID_PROCEDIMENTO_CLIENTE) INNER JOIN 
                                PROCEDIMENTO USING(ID_PROCEDIMENTO) INNER JOIN CLIENTE USING(ID_CLIENTE) 
                            WHERE ID_PROCEDIMENTO_CLIENTE = :ID ORDER BY DATA_VENCIMENTO";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("ID", IDPROCEDIMENTO);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        internal string getParcelasPagas(int id)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"select count(*) as parcelas from parcelas where id_procedimento_cliente = :id and status IN ('PAGO', 'PROMOCAO', 'PAGO CLINICA')";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            if (dt.Rows.Count == 0 || dt.Rows[0]["parcelas"].ToString().Equals("0"))
                return "0";
            else
                return dt.Rows[0]["parcelas"].ToString();
        }

        public string get(string id)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "select status from parcelas where id_parcela = :id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(com);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt.Rows[0]["status"].ToString();
        }

        internal void updateValor(int id, float novoValor)
        {
            try
            {
                //con.open();
                String sql = "update parcelas set valor = :valor WHERE id_parcela=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.Parameters.AddWithValue("valor", novoValor);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }
    }
}
